package com.dexter.year2023.charpter1_linkedlist.level2.topic2_3合并有序链表;

import com.dexter.year2023.charpter1_linkedlist.level1.Demo1.Node;

import static com.dexter.year2023.charpter1_linkedlist.level1.Demo1.initLinkedList;
import static com.dexter.year2023.charpter1_linkedlist.level1.Demo1.printLinkedList;

/**
 * LeetCode 1669. 合并两个链表
 * https://leetcode.cn/problems/merge-in-between-linked-lists/
 * <p>
 * 给你两个链表 list1 和 list2 ，它们包含的元素分别为 n 个和 m 个。
 * 请你将 list1 中下标从 a 到 b 的全部结点都删除，并将list2 接在被删除结点的位置。
 * 请你返回结果链表的头指针。
 * <p>
 * 示例 1：
 * 输入：list1 = [0,1,2,3,4,5], a = 3, b = 4, list2 = [1000000,1000001,1000002]
 * 输出：[0,1,2,1000000,1000001,1000002,5]
 * 解释：我们删除 list1 中下标为 3 和 4 的两个结点，并将 list2 接在该位置。上图中蓝色的边和结点为答案链表。
 * 示例 2：
 * 输入：list1 = [0,1,2,3,4,5,6], a = 2, b = 5, list2 = [1000000,1000001,1000002,1000003,1000004]
 * 输出：[0,1,1000000,1000001,1000002,1000003,1000004,6]
 * 解释：上图中蓝色的边和结点为答案链表。
 * <p>
 * 提示：
 * 3 <= list1.length <= 104
 * 1 <= a <= b < list1.length - 1
 * 1 <= list2.length <= 104
 *
 * @author Dexter
 */
public class Demo2MergeInBetween {
    public static void main(String[] args) {
        // 创建结点，链表初始化，打印链表 以后都写在import com.dexter.year2023.charpter1_linkedlist.level1.Demo1里
        int[] l1 = {0, 1, 2, 3, 4, 5};
        int[] l2 = {1000000, 1000001, 1000002};
        Node list1 = initLinkedList(l1);
        Node list2 = initLinkedList(l2);
        int a = 3, b = 4;
        // 本节方法
        Node head = mergeInBetween(list1, a, b, list2);
        printLinkedList(head);
    }

    /**
     * 在list1中间“替换”list2
     * 把list1在a\b的位置分别拆成pre1和post1
     * list2有自己的head 需要遍历自己的post2 再拼接
     *
     * @param list1
     * @param a
     * @param b
     * @param list2
     * @return
     */
    private static Node mergeInBetween(Node list1, int a, int b, Node list2) {
        Node pre1 = list1, post1 = list1, post2 = list2;
        int i = 0, j = 0;
        // 在list1中找位置
        while (pre1 != null && post1 != null & j < b) {
            if (i != a - 1) {
                pre1 = pre1.next;
                i++;
            }
            if (j != b) {
                post1 = post1.next;
                j++;
            }
        }
        post1 = post1.next;
        // 在list2中找位置
        while (post2.next != null) {
            post2 = post2.next;
        }
        // 拼接
        pre1.next = list2;
        post2.next = post1;
        return list1;
    }
}
